package com.form;


import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.*;
import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class 列表 extends JPanel {

    private DefaultTableModel tableModel;
    public JTable table;
    private TableColumn column;
    private int DEFAULE_WIDTH = 1000;
    private int DEFAULE_HEIGH = 560;
    private String[] 表头 = { "程序/网站", "密文"};
    private String[][] 数据 = new String[0][0]; // 初始化一开始先设置长度为0，不然即使没数据，表格也会显示一行空行

    public 列表() {
        setBorder(new EmptyBorder(5, 5, 5, 5));
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(DEFAULE_WIDTH, DEFAULE_HEIGH));
        createTable();
    }

    public void createTable(){
        int[] width = {100, 700}; // 列宽
        读取内容(); // 填充表头和数据行
        tableModel = new DefaultTableModel(数据, 表头){ // 用双数组创建DefaultTableModel对象
            @Override
            public boolean isCellEditable(int row, int column) {
                if(column == 1){
                    return true;
                }else{
                    return false; //表格不允许被编辑
                }
            }
        };
        table = new JTable(tableModel); // 创建表格组件

        // 设置表头样式
        JTableHeader head = table.getTableHeader(); // 创建表格标题对象
        head.setPreferredSize(new Dimension(head.getWidth(), 50));// 设置表头大小
        head.setFont(new Font("宋体", Font.BOLD, 20));// 设置表格字体
        head.setReorderingAllowed(false); // 设置表头不可拖动

        // 设置表格样式
        table.setRowHeight(40);// 设置表格行高
        table.setFont(new Font("宋体",0,14));
        table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);// 以下设置表格列宽
        table.setFillsViewportHeight(true);
        table.setAutoCreateRowSorter(true);
        for (int i = 0; i < 2; i++) {
            column = table.getColumnModel().getColumn(i);
            column.setPreferredWidth(width[i]);
        }

        // 设置表格间隔色
        DefaultTableCellRenderer ter = new DefaultTableCellRenderer() {
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                if (row % 2 == 0) setBackground(Color.pink);
                else if (row % 2 == 1) setBackground(Color.white);
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        };
        ter.setHorizontalAlignment(JLabel.CENTER);// 设置表格内容居中显示

        table.getColumn(表头[0]).setCellRenderer(ter);
        table.getColumn(表头[1]).setCellRenderer(new TableViewRenderer());
        // 创建滚动条组件，默认滚动条始终出现，初始化列表组件
        JScrollPane scrollPane = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(scrollPane, BorderLayout.CENTER);
    }

    private void 读取内容() {
        String path = System.getProperty("user.dir")+"/加密密码.txt";
        File file = new File(path);
        if (!file.exists()){
            return;
        }
        BufferedReader reader = null;
        String str = "";
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
            List<String> list = new ArrayList<>();
            while((str = reader.readLine())!=null){
                list.add(str);
            }
            数据 = new String[list.size()][];
            for (int i = 0; i < list.size(); i++) {
                String[] split = list.get(i).toString().split("：");
                String[] arr = {split[0], split[1]};
                数据[i] = arr;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void 刷新(){
        读取内容(); // 先重新读取一遍txt的内容，得到最新的数据
        int rowCount = tableModel.getRowCount(); // 获得未刷新前表格的行数（没数据时默认会有一行）
        int length = 数据.length; // 得到最新有多少条数据

        for (int i = 0; i < 数据.length; i++) {
            String[] obj = 数据[i];
            // txt的行数大于表格的行数，要将txt多出来的数据添加到表格中，只将新数据添加到表格中
            if (i >= rowCount){
                tableModel.addRow(obj);
            }
            String col0 = (String) tableModel.getValueAt(i, 0);
            String col1 = (String) tableModel.getValueAt(i, 1);
            // 这里是假如在加密中改了某一项的密码，密文也就变了，所以把某项对应的新密文更新到表格中
            if (obj[0].equals(col0) && !obj[1].equals(col1)){
                tableModel.setValueAt(obj[1],i,1);
            }
        }
        tableModel.setRowCount(length); // 更新表格的行数
    }

}
